/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.isystem.autpart.controller;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.isystem.autpart.beans.TControlModulo;
import org.isystem.autpart.beans.TModulo;
import org.isystem.autpart.beans.TRol;
import org.isystem.autpart.dao.DAOGeneral;
import org.isystem.autpart.util.idNew;
import org.zkoss.bind.ValidationContext;
import org.zkoss.bind.Validator;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.bind.validator.AbstractValidator;
import org.zkoss.zul.Listcell;

/**
 *
 * @author miguel-lap
 */
public class ManagerAdmRol {
    
    private static final long serialVersionUID = 1L;
    private List<TRol> roles;
    private List<TModulo> modulosAsignados;
    private List<TModulo> modulosNoAsignados;
    private TRol rol = new TRol();
    private TRol rolSelected = new TRol();
    private DAOGeneral dao = new DAOGeneral();
    private boolean verSave;
    private boolean mostrarAdd;
    private String saveLabel;
    private String buscar;
    
    //validators
    
    //validation messages
    Map<String, String> validationMessages = new HashMap<String,String>();
    
    @Init
    public void init(){
        System.out.println("Ini");
        actualizaListaRoles("");
        mostrarAdd = false;
    }
    
    //Validators
    public Validator getFormValidator(){
        System.out.println("validator all");
        return new AbstractValidator() {
//            private HashMap validationMessages;

            public void validate(ValidationContext ctx) {
// Consultar si es persona natural o juridica
                String val = (String)ctx.getProperties("denominacion")[0].getValue();
                System.out.println("denominacion "  + val);
//                ValidationMessages vmsgs = (ValidationMessages) ctx.getValidatorArg("vmsgs");
//                validationMessages.put("usuarioTextBox", "value1 error");
//                ctx.setInvalid(); // mark invalid
//                ValidationMessages vmsgs = ((BinderCtrl)ctx.getBindContext().getBinder()).getValidationMessages();
//                addInvalidMessage(ctx, "usuario", "value1 error");
//                System.out.println("111");
//                ctx.getBindContext().getBinder().notifyChange(validationMessages, "usuarioTextBox");
//                if(invalidCondition01(val)){
//                    addInvalidMessage(ctx, "fkey1", "value1 error");
//                }
//                val = (String)ctx.getProperties("value2")[0].getValue();
//                if(invalidCondition02(val)){
//                    addInvalidMessage(ctx, "fkey2", "value2 error");
//                }
//                val = (String)ctx.getProperties("value3")[0].getValue();
//                if(invalidCondition03(val)){
//                    addInvalidMessage(ctx, "fkey3", "value3 error");
//                }
//                ctx.getBindContext().getBinder().notifyChange(validationMessages, "usuarioTextBox");
                
                
            }
        };
    }
    
    // botones
    @Command
    @NotifyChange({"verSave","rol","mostrarAdd","saveLabel"})
    public void onClickadd() {
        System.out.println("click en agregar");
        rol = new TRol();
        mostrarAdd = true;
        verSave = true;
        saveLabel ="Guardar";
    }
    
    @Command
    @NotifyChange({"roles", "buscar"})
    public void onClickSearch() {
        System.out.println("click search");
        actualizaListaRoles(" where r.denominacion like '%"+buscar+"%'");
    }
    
    @NotifyChange({"rol","verSave","roles"})
    @Command()
    public void guardar() {
        System.out.println("guardar");
        //Asignacion de IDs
        if (saveLabel.equals("Guardar")) {
            //Asignacion de IDs
            rol.setId(idNew.id());
        } else {
        }
        dao.persist(rol);
        verSave = false;
        actualizaListaRoles("");
        System.out.println("fin guarda");
        return;
    }
    
    @NotifyChange({"verSave","rol","mostrarAdd","saveLabel"})
    @Command()
    public void edita(@BindingParam("rol") TRol rl ) {
        System.out.println("editar");
        verSave = true;
        rol = new TRol();   
        rol = (TRol) dao.load(TRol.class, rl.getId()+"");
        mostrarAdd = true;
        saveLabel = "Modificar";
        
    }
    
    @NotifyChange({"rol","mostrarAdd","saveLabel","roles"})
    @Command()
    public void elimina(@BindingParam("rol") TRol rl ) {
        System.out.println("eliminar");
        rol = rl;
        dao.delete(rol);
        mostrarAdd = false;
        actualizaListaRoles("");
    }
    
    // Drag and Drop
    @NotifyChange({"rol","verSave","mostrarAdd","rolSelected","modulosAsignados","modulosNoAsignados"})
    @Command()
    public void movLAN(@BindingParam("modAs") Listcell ma ) {
        System.out.println("mueve Asignados a No Asignados");
        TModulo mod = (TModulo) dao.findOne("from TModulo m where m.denominacion = '" +ma.getLabel()+"' ");
        TControlModulo controlModulo = new TControlModulo();
        rol = (TRol) dao.load(TRol.class, rol.getId()+"");
        mod = (TModulo) dao.load(TModulo.class, mod.getId()+"");
        controlModulo.setId(idNew.id());
        controlModulo.setTModulo(mod);
        controlModulo.setTRol(rol);
        dao.persist(controlModulo);
        actualizaListaAsignados(rol);
    }
    
    @NotifyChange({"rol","mostrarAdd","rolSelected","modulosAsignados","modulosNoAsignados"})
    @Command()
    public void movLNA(@BindingParam("modNAs") Listcell mn ) {
        System.out.println("mueve No Asignados a Asignados");
        TModulo mod = (TModulo) dao.findOne("from TModulo m where m.denominacion = '" +mn.getLabel()+"' ");
        TControlModulo controlModulo = (TControlModulo) dao.findOne("from TControlModulo cm where cm.TRol.id = '"+ 
                rol.getId() +"' and cm.TModulo.id = '" + mod.getId() + "'");
        controlModulo = (TControlModulo) dao.load(TControlModulo.class, controlModulo.getId()+"");
        dao.delete(controlModulo);
        actualizaListaAsignados(rol);
    }
    
    // Change Selected
    @NotifyChange({"rol","verSave","mostrarAdd","rolSelected","modulosAsignados","modulosNoAsignados"})
    @Command()
    public void selecciona() {
        System.out.println("Selecciona");
        verSave = false;
        rol = new TRol();
        rol = rolSelected;
        mostrarAdd = true;
        actualizaListaAsignados(rol);
    }

    
    // Metodos
    private void actualizaListaRoles(String sql) {
        roles = new LinkedList<TRol>();
        roles.clear();
        roles = dao.findAll("from TRol r" + sql);
    }
    
    private void actualizaListaAsignados(TRol r) {
        modulosAsignados = new LinkedList<TModulo>();
        modulosAsignados.clear();
        modulosNoAsignados = new LinkedList<TModulo>();
        modulosNoAsignados.clear();
        modulosAsignados = dao.findAll("select cm.TModulo from TControlModulo cm where cm.TRol.id = '"+r.getId()+"'");
        List<TModulo> modulos = dao.findAll("from TModulo");
        TModulo m = new TModulo();
        boolean sonDiferentes =true;
        for (TModulo mod : modulos) {
            for (TModulo modAsig : modulosAsignados) {
                if (!mod.getDenominacion().equals(modAsig.getDenominacion())) {
                    m = mod;
                    sonDiferentes = sonDiferentes & true;
                }else{
                    sonDiferentes = sonDiferentes & false;
                }
            }
            if (sonDiferentes){
                modulosNoAsignados.add(mod);
            }
            sonDiferentes = true;
        }
    }

    public List<TRol> getRoles() {
        return roles;
    }

    public void setRoles(List<TRol> roles) {
        this.roles = roles;
    }

    public TRol getRol() {
        return rol;
    }

    public void setRol(TRol rol) {
        this.rol = rol;
    }

    public TRol getRolSelected() {
        return rolSelected;
    }

    public void setRolSelected(TRol rolSelected) {
        this.rolSelected = rolSelected;
    }

    public boolean isVerSave() {
        return verSave;
    }

    public void setVerSave(boolean verSave) {
        this.verSave = verSave;
    }

    public boolean isMostrarAdd() {
        return mostrarAdd;
    }

    public void setMostrarAdd(boolean mostrarAdd) {
        this.mostrarAdd = mostrarAdd;
    }

    public String getSaveLabel() {
        return saveLabel;
    }

    public void setSaveLabel(String saveLabel) {
        this.saveLabel = saveLabel;
    }

    public String getBuscar() {
        return buscar;
    }

    public void setBuscar(String buscar) {
        this.buscar = buscar;
    }

    public Map<String, String> getValidationMessages() {
        return validationMessages;
    }

    public void setValidationMessages(Map<String, String> validationMessages) {
        this.validationMessages = validationMessages;
    }

    public List<TModulo> getModulosAsignados() {
        return modulosAsignados;
    }

    public void setModulosAsignados(List<TModulo> modulosAsignados) {
        this.modulosAsignados = modulosAsignados;
    }

    public List<TModulo> getModulosNoAsignados() {
        return modulosNoAsignados;
    }

    public void setModulosNoAsignados(List<TModulo> modulosNoAsignados) {
        this.modulosNoAsignados = modulosNoAsignados;
    }

    
}